<!DOCTYPE html>
<html lang="en" >
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="GoJun" />
	
	
	
	<title>Android 如何快速全局更换字体 ｜ GoJun</title>
	
    
    
    <meta name="description" content="在 Android 8.0（API 26）和 Support 包 26 以上版本提供了一种可将自定义字体声明为 XML 布局中的资源更快更方便的方式，并且该种方式兼容 Android 4.1 版本以上，官方文档介绍 地址。 网上搜索了很多资料，在未有此特性时处理是相当麻烦的" />
    

    
    
    <meta name="keywords" content="Hugo, theme, zozo" />
    

	
    
    <link rel="shortcut icon" href="https://gojun.me/images/favicon.ico" />

    <link rel="stylesheet" type="text/css" media="screen" href="https://gojun.mecss/normalize.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://gojun.me/css/zozo.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://gojun.me/css/highlight.css" />

    
    
</head>

<body>
    <div class="main animate__animated animate__fadeInDown">
        <div class="nav_container animated fadeInDown">
    <div class="site_nav" id="site_nav">
        <ul>
            
            <li>
                <a href="/">Home</a>
            </li>
            
            <li>
                <a href="/posts/">Archive</a>
            </li>
            
            <li>
                <a href="/tags/">Tags</a>
            </li>
            
            <li>
                <a href="/projects/">Projects</a>
            </li>
            
        </ul>
    </div>
    <div class="menu_icon">
        <a id="menu_icon"><i class="ri-menu-line"></i></a>
    </div>
</div>
        <div class="header animated fadeInDown">
    <div class="site_title_container">
        <div class="site_title">
            <h1>
                <a href="https://gojun.me">
                    <span>GoJun</span>
                </a>
            </h1>
        </div>
        <div class="description">
            <p class="sub_title">为向往生活努力奋斗！</p>
            <div class="my_socials">
                
                
                <a href="https://github.com/freelander" title="github" target="_blank"><i class="ri-github-fill"></i></a>
                
                
                <a href="https://gojun.me/index.xml" type="application/rss+xml" title="rss" target="_blank"><i
                        class="ri-rss-fill"></i></a>
            </div>
        </div>
    </div>
</div>
        <div class="content">
            <div class="post_page">
                <div class="post animate__animated animate__fadeInDown">
                    <div class="post_title post_detail_title">
                        <h2><a href='/posts/android-change-font/'>Android 如何快速全局更换字体</a></h2>
                        <span class="date">2019.07.06</span>
                    </div>
                    <div class="post_content markdown"><p>在 Android 8.0（API 26）和 Support 包 26 以上版本提供了一种可将自定义字体声明为 XML 布局中的资源更快更方便的方式，并且该种方式兼容 Android 4.1 版本以上，官方文档介绍 <a href="https://developer.android.google.cn/guide/topics/ui/look-and-feel/fonts-in-xml.html#java">地址</a>。</p>
<p>网上搜索了很多资料，在未有此特性时处理是相当麻烦的，当然也有一些第三方开源库来帮助处理，其中最多人推荐使用的是 <a href="https://github.com/InflationX/Calligraphy">Calligraphy</a>。现在有了此特性，我们就可以非常容易全局更改 App 字体。</p>
<h2 id="如何引入第三方字体包">如何引入第三方字体包</h2>
<ol>
<li>
<p>右键单击资源 res 文件夹，选择 New &gt; Android resource directory；</p>
</li>
<li>
<p>在资源类型列表中选择 font，然后点击 OK；</p>
</li>
</ol>
<p>

<div class="fancybox">
<a data-fancybox="demo" href="/images/2019/07/01.png">
<img src="/images/2019/07/01.png" alt="image"  />
</a>
</div>

</p>
<ol start="3">
<li>将你的第三方字体包放到添加到刚创建的 font 文件夹；</li>
</ol>
<p>

<div class="fancybox">
<a data-fancybox="demo" href="/images/2019/07/02.png">
<img src="/images/2019/07/02.png" alt="image"  />
</a>
</div>

</p>
<ol start="4">
<li>Android Studio 支持预览字体，你可以双击字体包即可预览</li>
</ol>
<p>

<div class="fancybox">
<a data-fancybox="demo" href="/images/2019/07/03.png">
<img src="/images/2019/07/03.png" alt="image"  />
</a>
</div>

</p>
<p>至此你已成功引入第三方字体包了，接下来介绍如何使用以及一些技巧。</p>
<h2 id="如何使用">如何使用</h2>
<p>在 xml 文件中给所需要更换字体的控件增加一个属性 fontFamily</p>
<div class="highlight"><pre class="chroma"><code class="language-fallback" data-lang="fallback">&lt;TextView
    android:layout_width=&#34;wrap_content&#34;
    android:layout_height=&#34;wrap_content&#34;
    android:text=&#34;Hello World!&#34;
    android:fontFamily=&#34;@font/hind_siliguri_regular&#34; /&gt;
</code></pre></div><p>在代码中动态更改控件的字体</p>
<div class="highlight"><pre class="chroma"><code class="language-fallback" data-lang="fallback">Typeface typeface = ResourcesCompat.getFont(context, R.font.hind_siliguri_regular);
// 若是粗体使用 Typeface.BOLD
textView.setTypeface(typeface, Typeface.NORMAL);
</code></pre></div><h2 id="如何全局字体替换更改">如何全局字体替换更改</h2>
<p>在 styles.xml 文件中找到 App 主题增加自定义字体属性；</p>
<div class="highlight"><pre class="chroma"><code class="language-fallback" data-lang="fallback">&lt;!-- Base application theme. --&gt;
&lt;style name=&#34;AppTheme&#34; parent=&#34;Theme.AppCompat.Light.DarkActionBar&#34;&gt;

    ...

    &lt;!--自定义字体--&gt;
    &lt;item name=&#34;android:fontFamily&#34;&gt;@font/hind_siliguri_regular&lt;/item&gt;
&lt;/style&gt;
</code></pre></div><p>然后在 AndroidManifest.xml 文件的程序定义里，应用此主题；</p>
<div class="highlight"><pre class="chroma"><code class="language-fallback" data-lang="fallback">&lt;application
    android:allowBackup=&#34;true&#34;
    android:icon=&#34;@mipmap/ic_launcher&#34;
    android:label=&#34;@string/app_name&#34;
    android:roundIcon=&#34;@mipmap/ic_launcher_round&#34;
    android:supportsRtl=&#34;true&#34;
    android:theme=&#34;@style/AppTheme&#34;&gt;
    
    ...
    
&lt;/application&gt;
</code></pre></div><p>这样就全局更换字体样式了。</p>
<h2 id="如何实现不同语言使用不同字体">如何实现不同语言使用不同字体</h2>
<p>通过上面方法可以实现了 App 使用第三方字体，可这时候如果产品要求在不同语言下使用不同的字体；</p>
<p>那么如何实现呢？很简单只需要复制一份 styles.xml 文件在对应的语言 values 文件下，更换所对应的字体即可。</p>
<ol>
<li>
<p>右键单击资源 res 文件夹，选择 New &gt; Android resource directory；</p>
</li>
<li>
<p>在资源类型列表中选择 values，左边边选择 Locale，然后选择你对应的语言，然后点击 OK；</p>
</li>
</ol>
<p>

<div class="fancybox">
<a data-fancybox="demo" href="/images/2019/07/04.png">
<img src="/images/2019/07/04.png" alt="image"  />
</a>
</div>

</p>
<ol start="3">
<li>这时候会看到新建了一个文件夹 values-ar</li>
</ol>
<p>

<div class="fancybox">
<a data-fancybox="demo" href="/images/2019/07/05.png">
<img src="/images/2019/07/05.png" alt="image"  />
</a>
</div>

</p>
<ol start="4">
<li>复制一份 styles.xml 文件到 values-ar 文件夹下，修改主题下的字体配置;</li>
</ol>
<div class="highlight"><pre class="chroma"><code class="language-fallback" data-lang="fallback">&lt;!-- Base application theme. --&gt;
&lt;style name=&#34;AppTheme&#34; parent=&#34;Theme.AppCompat.Light.DarkActionBar&#34;&gt;
    
    ...
    
    &lt;item name=&#34;android:fontFamily&#34;&gt;@font/ar_regular&lt;/item&gt;
&lt;/style&gt;
</code></pre></div><p>到这里当你切换语言到中东阿拉伯语的时候，就会显示对应字体了。</p>
<h2 id="推荐阅读">推荐阅读</h2>
<p><a href="https://gojun.me/2017/06/06/android-rtl/">Android 中东阿拉伯语适配，看这一篇够了</a></p>
</div>
                    <div class="post_footer">
                        
                        <div class="meta">
                            <div class="info">
                                <span class="field tags">
                                    <i class="ri-stack-line"></i>
                                    
                                    <a href="https://gojun.me/tags/android/">Android</a>
                                    
                                    <a href="https://gojun.me/tags/font/">Font</a>
                                    
                                </span>
                            </div>
                        </div>
                        
                    </div>
                </div>
                
                
                <div class="doc_comments"></div>
                
            </div>
        </div>
    </div>
    <a id="back_to_top" href="#" class="back_to_top"><i class="ri-arrow-up-s-line"></i></a>
    <footer class="footer">
    <div class="footer_slogan">
        <span></span>
    </div>
</footer>
    <script src="https://gojun.me/js/jquery-3.5.1.min.js"></script>
<link href="https://gojun.me/css/fancybox.min.css" rel="stylesheet">
<script src="https://gojun.me/js/fancybox.min.js"></script>
<script src="https://gojun.me/js/zozo.js"></script>


<script type="text/javascript" async
    src="https://cdn.bootcss.com/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
        MathJax.Hub.Config({
            tex2jax: {
                inlineMath: [['$', '$'], ['\\(', '\\)']],
                displayMath: [['$$', '$$'], ['\[\[', '\]\]']],
                processEscapes: true,
                processEnvironments: true,
                skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
                TeX: {
                    equationNumbers: { autoNumber: "AMS" },
                    extensions: ["AMSmath.js", "AMSsymbols.js"]
                }
            }
        });

        MathJax.Hub.Queue(function () {
            
            
            
            var all = MathJax.Hub.getAllJax(), i;
            for (i = 0; i < all.length; i += 1) {
                all[i].SourceElement().parentNode.className += ' has-jax';
            }
        });
    </script>

<style>
    code.has-jax {
        font: inherit;
        font-size: 100%;
        background: inherit;
        border: inherit;
        color: #515151;
    }
</style>



<script type="application/javascript">
var doNotTrack = false;
if (!doNotTrack) {
	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
	ga('create', 'UA-142037913-1', 'auto');
	
	ga('send', 'pageview');
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>

</body>

</html>